package offer2

/*
原题链接:
https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/

剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ，
它原来是一个升序排列的数组，并按上述情形进行了一次旋转。请返回旋转数组的最小元素。

例如，数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转，该数组的最小值为1。

示例 1：
输入：[3,4,5,1,2]
输出：1

示例 2：
输入：[2,2,2,0,1]
输出：0
*/
func stockManagement(stock []int) int {

	left := 0 //1.声明左右指针
	right := len(stock) - 1
	var mid int

	for left < right { //2.二分查找
		mid = left + (right-left)/2
		if stock[mid] > stock[right] {
			left = mid + 1
		} else if stock[mid] < stock[right] {
			right = mid
		} else {
			return findMin(stock, left, right)
		}
	}

	return stock[left]
}

func findMin(numbers []int, left int, right int) int {
	result := numbers[left]

	//从头到尾遍历切片, 获取最小值
	for i := left; i <= right; i++ {
		if numbers[i] < result {
			result = numbers[i]
		}
	}

	return result
}
